package com.course.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.common.domain.Pages.PageResult;
import com.course.domain.dto.CourseContentDto;
import com.course.domain.dto.CourseDto;
import com.course.domain.dto.SendComment;
import com.course.domain.params.CoursePageParams;
import com.course.domain.pojo.Course;
import com.course.domain.vo.TreeCourseDetailVo;
import com.course.domain.vo.*;

import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author 小杰大人
 * @since 2025-02-18
 */
public interface ICourseService extends IService<Course> {
    /**
     * 获取课程列表
     * @param pageParams 分页参数
     * @return
     */
    PageResult<CourseVo> getCourseList(CoursePageParams pageParams);

    /**
     * 课程管理
     */
    PageResult<CourseManagerVo> getCourseManagers(CoursePageParams coursePageParams);

    /**
     * 根据课程id获取课程详细信息
     * @param courseId
     * @return
     */
    CourseDetailVo getCourseDetails(Long courseId);

    /**
     * 课程相关查询
     * @param courseId 课程id
     * @param limit 查询数量
     * @return
     */
    List<CourseVo> getRelatedCourses(Long courseId , Integer limit);

    /**
     * 根据课程id返回课程对应的课程内容信息
     * @param courseId 课程id
     * @return 课程信息
     */
    CourseContentDto getCourseContentById(Long courseId);

    /**
     * 根据课程id获取当前课程下的评论信息
     */
    CourseCommentVo getCourseCommentList(Long courseId, Integer sorted);

    /**
     * 课程发布
     * @param courseDto
     */
    void publisher(CourseDto courseDto);

    /**
     * 修改课程信息
     * @param courseDto
     */
    void updateCourse(CourseDto courseDto);

    CourseDto getCourseInfoById(Long courseId);

    /**
     * 修改课程状态
     * @param course
     */
    void updateStatus(Course course);

    /**
     * 移除课程
     * @param courseId
     */
    void removeCourse(Long courseId);

    /**
     * 删除有关当前用户id的一切数据
     * @param userId
     */
    void removeCourseByUserId(Long userId);

    /**
     * 课程点赞
     * @param courseId
     */
    void likeCourse(Long courseId);

    /**
     * 课程收藏
     * @param courseId
     */
    void favoriteCourse(Long courseId);


    /**
     * 滚动分页读取用户收件箱（消息列表）内的消息
     * @param lastTimestamp 上一次读取到的时间戳
     * @param offset 偏移量
     * @return
     */
    InboxPageVo inboxPage(Long lastTimestamp, Integer offset);

    /**
     * 清空收件箱内的信息 直接删除对应的redisKey即可
     */
    void clearInbox();

    /**
     * 获取当前用户购买的课程 喜欢的课程 关注的教师数量
     * @return
     */
    CourseCurInfoVo getCourseCurInfo();

    /**
     * 根据用户id获取当前用户购买的全部课程
     * @param userId 用户id
     * @return 课程列表
     */
    List<PurchasedCourseVo> getPurchasedCourses(Long userId);

    /**
     * 我购买的课程
     * @return
     */
    List<PurchasedCourseVo> getPurchasedCourses();
    /**
     * 根据用户名获取当前用户发布的全部课程
     * @param username 用户名
     * @return 课程列表
     */
    List<CourseVo> getCourseListPublishByUsername(String username);

    /**
     * 发送课程评论
     * @param sendComment 评论信息
     */
    void sendComment(SendComment sendComment);

    /**
     * 点赞评论
     * @param commentId 评论id
     */
    void likeComment(Long commentId);

    /**
     * 获取课程目录以及内容信息
     * @param id
     * @return
     */
    List<TreeCourseDetailVo> getCourseDirectoryList(Long id);

    /**
     * 分页获取当前用户收藏的课程
     * 基于Redis的ZSet结构进行滚动分页
     * @param lastTimestamp 上一次查询的最大值
     * @param offset 偏移量
     */
    FavoritePageVo favoritePageList(Long lastTimestamp, Long offset);

    /**
     * 根据课程的唯一标识获取课程信息
     * @param uniqueIdentification 课程的唯一标识 {课程id 或 课程名称}
     * @return 课程信息
     */
    Course getCourseInfoByUniqueIdentification(Object uniqueIdentification);


    /**
     * 获取课程标签列表
     */
    List<TreeCourseTagsVo> getCourseTags();

    /**
     * 判断当前用户是否收藏该课程
     * @param usersId 用户id
     * @param courseId 课程id
     * @return
     */
    CourseLikeAndFavoriteVo isLikeAndFavorite(Long usersId, Long courseId);

    /**
     * 立即购买界面课程详情
     * @param courseId
     * @return
     */
    CourseBuyVo getBuyCourseById(Long courseId);

    /**
     * 课程销量 + 1
     * @param courseId
     */
    void saleIncrement(Long courseId);
}
